package dhy.com.message;

import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>
 *     顶层消息类
 * </p>
 * @author zdh
 */
@Data
public abstract class Message implements Serializable {

    /**
     * 根据消息类型，获得对应的消息 class
     * @param messageType 消息类型字节
     * @return 消息 class
     */
    public static Class<? extends Message> getMessageClass(int messageType) {
        return messageClasses.get(messageType);
    }


    /**
     * 消息序列化ID
     */
    private int sequenceId;

    /**
     * 消息类型
     */
    private int messageType;

    /**
     * @return 返回消息的类型
     */
    public abstract int getMessageType();


    /**
     * 心跳检测消息
     */
    public static final int PingMessage = 120;
    public static final int PongMessage = 121;

    /**
     * 请求类型 byte 值
     */
    public static final int RPC_MESSAGE_TYPE_REQUEST = 1;

    /**
     * 响应类型 byte 值
     */
    public static final int  RPC_MESSAGE_TYPE_RESPONSE = 2;


    /**
     * 存放消息类型整数标识和对应的消息类型的映射关系,方便序列化得到消息具体Class类型
     */
    private static final Map<Integer, Class<? extends Message>> messageClasses = new HashMap<>();


    /**
     * 初始化映射关系
     */
    static {
        messageClasses.put(RPC_MESSAGE_TYPE_REQUEST, RpcRequestMessage.class);
        messageClasses.put(RPC_MESSAGE_TYPE_RESPONSE, RpcResponseMessage.class);
        messageClasses.put(PingMessage, PingMessage.class);
        messageClasses.put(PongMessage, PongMessage.class);
    }

}
